# 导入flask模块
from flask import session,current_app,g,jsonify
# 导入数据库模类
from info.models import User,News
# 导入自定义相应状态码文件
from info.utils.response_code import RET
# 导入方法工具
import functools
# 导入常量包
from info import constants

def ranking_filter(index):
    """
    定义模板过滤器: 给点击排行的前三个新闻添加图标
    :param index: 索引
    :return: 样式类名
    """
    if index == 0:
        return 'first'
    elif index == 1:
        return 'second'
    elif index == 2:
        return 'third'
    else:
        return ''

def get_user(func):
    """
    定义一个过滤器,获取当前登录的用户(登录验证装饰器)
    :return:
    """
    def wrapper(*args, **kwargs):
        # 使用请求上下文对象,获取user_id
        user_id = session.get("user_id")
        user = None
        # 查询mysql
        try:
            user = User.query.get(user_id)
        except Exception as e:
            current_app.logger.error(e)
        # 使用应用上下文g,在请求过程中临时存储变量
        g.user = user
        return func(*args, **kwargs)
    # 为了防止由于装饰器引起的函数名的改变
    wrapper.__name__ = func.__name__
    return wrapper

def rank_list(func):
    """
    封装点击率排行功能
    :param func:
    :return:
    """
    @functools.wraps(func)  # 使用functools模块,固定被装饰函数的函数名
    def wrapper(*args, **kwargs):
        # 实现点击排行
        # 1.查询排行
        try:
            rankings = News.query.order_by(News.create_time.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="查询排行错误")
        # 2.检查排行
        if not rankings:
            return jsonify(errno=RET.DATAEXIST, errmsg="点击排行结果为空")
        # 3.将列表容器添加到data字典中传给模板
        ranking_list = []
        for ranking in rankings:
            ranking_list.append(ranking.to_dict())
        g.rank_list = ranking_list
        return func(*args, **kwargs)
    return wrapper
